package cn.ekuma.util;

public class ArrayQueue<E> {

    private int size ;   
    private E[] arrStr ;   
    private int head = 0;   
    private int tail = 0;   
    private int next=-1;

    
    public ArrayQueue(int size){
    	this.size=size;
    	arrStr = (E[]) new Object[size];  
    }
    
    /**  
     * 入队  
     * @param o  
     */  
    public void enqueue(E o) {   
            // 如果队列已满   
            if ((tail + 1) % size == head) {   
            	dequeue();
            }   
            // 如果队列未满   
            arrStr[tail] = o;   
            // 指针下移   
            tail = (tail + 1) % size;   
            resertCur();
    }   
  
    /**  
     * 出队  
     * @return  
     */  
    public E dequeue() {   
            // 如果队列为空   
            if (head == tail) {   
                return null;
            }   
            // 队列非空   
            E tempStr = arrStr[head];   
  
            arrStr[head] = null;//注，这里出队后释放对象，加快回收，不然大的对象可能造内存泄露   
            head = (head + 1) % size;
            resertCur();
            return tempStr;   
  
    }   
  
    //取队列第一个   
    public E front() {   
            // 如果队列为空   
            if (head == tail) {   
                return null;
            }   
            // 队列非空   
            return arrStr[head]; 
    }   
  
    //队列是否为空   
    public boolean isEmpty() {   
        return head == tail;   
    }   
  
    //队列大小   
    public int size() {   
        return Math.abs(tail - head);   
    }   

    public E next() {  
    	// 如果队列为空   
        if (isEmpty()) {   
            return null;
        }
        if(next==-1||next==tail)
        	next=head;
        else{
        	next = (next + 1) % size;
            if(next==tail)
            	next=head;
        }
        E temp=arrStr[next]; 
        return temp;
    }
    
    public E prev(){
    	// 如果队列为空   
        if (isEmpty()) {   
            return null;
        }
        if(next==-1||next==tail){
          if(tail!=0)
        	next=(tail - 1) % size;
          else
        	next=size-1;
        }else{
           if(next!=head)
                next = (next - 1) % size;
            else
            	if(tail!=0)
                	next=(tail - 1) % size;
                  else
                	next=size-1;
        }
        E temp=arrStr[next]; 
        return temp;
    }
    
    public void resertCur(){
    	next=-1;
    }

    public static void main(String agrs[]) {  
    	ArrayQueue<Integer> test=new ArrayQueue<Integer>(5);
    	for(int i=1;i<6;i++)
    		test.enqueue(i);
    	for(int i=1;i<6;i++)
    		System.out.println("5 value the prev:"+test.prev());
    	System.out.println("----------");
    	for(int i=1;i<6;i++)
    		System.out.println("5 value the next:"+test.next());
    	System.out.println("----------");
    	test=new ArrayQueue<Integer>(10);
    	for(int i=1;i<11;i++)
    		test.enqueue(i);
    	for(int i=1;i<11;i++)
    		System.out.println("10 value the prev:"+test.prev());
    	System.out.println("----------");
    	for(int i=1;i<11;i++)
    		System.out.println("10 value the next:"+test.next());
    	
    	System.out.println("----------");
        test=new ArrayQueue<Integer>(5);
    	for(int i=1;i<11;i++)
    		test.enqueue(i);
    	for(int i=1;i<11;i++)
    		System.out.println("5 retl value the prev:"+test.prev());
    	System.out.println("----------");
    	for(int i=1;i<11;i++)
    		System.out.println("5 retl value the next:"+test.next());
    	
    	
 }  
}
